#pragma once
#include <iostream>
#include <mysql/mysql.h>

// 用户信息 sql 类
class UserSQL
{
private:
    MYSQL mysql_conn;  // 数据库连接对象
    MYSQL *mysql_h;    // 连接句柄
    MYSQL_RES *result; // 查询结果
    bool is_connect;   // 连接标记
public:
    // 构造函数
    UserSQL() : is_connect(false) {}
    // 析构函数
    ~UserSQL() { Close(); }

    // 关闭连接
    void Close()
    {
        if (is_connect == true)
        {
            mysql_close(mysql_h); // 关闭连接
            is_connect = false;
        }
    }
    // 连接数据库
    bool Connect(const std::string &user = "root", const std::string &password = "123456", const std::string &database = "account_information")
    {
        // 初始化MySQL连接结构体
        mysql_h = mysql_init(&mysql_conn);
        // 初始化失败
        if (mysql_h == nullptr)
        {
            return false;
        }

        // 与MySQL服务器建立连接
        if (mysql_real_connect(mysql_h, "127.0.0.1", user.c_str(), password.c_str(), database.c_str(), 3306, nullptr, 0) == nullptr)
        {
            return false;
        }

        // 连接成功
        return true;
    }

    // 查找用户名
    std::string SearchUser(const char *name)
    {
        // 用于存储查询到的用户密码
        std::string passwd;
        if (Connect() == false)
        {
            return passwd;
        }
        is_connect = true;

        // 构造用于查询用户密码的SQL语句字符串，初始部分是固定的查询语句结构，从名为"infor"的表中查询"password"字段
        std::string sql_sentence = "select password from infor where username = ";
        sql_sentence += "'";
        sql_sentence.append(name);
        sql_sentence += "'";

        // 执行构造好的SQL查询语句，出错返回非0
        if (mysql_query(mysql_h, sql_sentence.c_str()) != 0)
        {
            return passwd;
        }
        // 获取查询结果集并存储在result变量中
        result = mysql_store_result(mysql_h);
        if (result == nullptr)
        {
            return passwd;
        }
        // 结果集中取出第一行记录
        MYSQL_ROW r = mysql_fetch_row(result);
        passwd.append(r[0]);

        // 释放之前通过mysql_store_result获取的结果集所占用的内存资源，避免内存泄漏
        mysql_free_result(result);
        // 调用Close函数关闭与数据库的连接，此处假设类中有对应的Close函数实现关闭连接的具体操作
        Close();

        return passwd;
    }

    // 增加用户
    bool AddUser(const char *name, const char *password)
    {
        if (Connect() == false)
        {
            return false;
        }
        is_connect = true;

        // 构建指令字符串
        std::string sql_sentence = "insert into infor(username, password) value";
        sql_sentence.append("('");
        sql_sentence.append(name);
        sql_sentence.append("','");
        sql_sentence.append(password);
        sql_sentence.append("')");

        // 执行SQL语句
        if (mysql_query(mysql_h, sql_sentence.c_str()) != 0)
        {
            return false;
        }

        Close();
        return true;
    }
};